#include "bmemallocator.h"
#include <cstddef>
#include <iostream>

using namespace std;

BMemAllocator* BMemAllocator::freeStore = nullptr;
const int BMemAllocator::freeStoreChunk = 24;

BMemAllocator::BMemAllocator()
    : next(nullptr)
    , id(0)
{

}

BMemAllocator::~BMemAllocator()
{

}

/*
 * 思想，申请一大块内存，然后再切割成不同大小的当前内容。
 * 缺点：1、数据类型中要定义next指针，这样就会多消耗4*N个字节。
 *      2、由于所有的释放都是再delete中进行，当使用大数量当前数据结构时，最终都会在delete中链接到一起。
 *      3、由于只有new char操作，没有delete操作，最终内存无法及时还给操作系统
*/
//void *BMemAllocator::operator new(size_t size)
//{
//    cout << "operator new size is = " << size << endl;
//    BMemAllocator *p;
//    if (!freeStore)
//    {
//        size_t chunkSize = freeStoreChunk * size;
//        freeStore = p = reinterpret_cast<BMemAllocator*>(new char[chunkSize]);
//        for (; p != &freeStore[freeStoreChunk - 1]; ++p)
//        {
//            p->next = p + 1;
//        }
//        p->next = 0;
//    }
//    p = freeStore;
//    freeStore = freeStore->next;
//    return p;
//}

void BMemAllocator::operator delete(void *ptr)
{
    cout << "operator delete is call" << endl;
    static_cast<BMemAllocator*>(ptr)->next = freeStore;
    freeStore->next = static_cast<BMemAllocator*>(ptr);
}
